package zy.blue7.common.vo.req;


import lombok.Data;
import lombok.ToString;
import zy.blue7.common.vaildate.groups.Create;
import zy.blue7.common.vaildate.groups.Update;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * @Author: blue7
 * @Date: 2021/11/20 11:09
 * @Version 1.0
 * @Description
 */
@Data
@ToString
public class UserReq {

    @NotNull(message = "id不能为空", groups = {Create.class, Update.class})
    private Long id;

    /**
     * groups 表示只有在 @Validated(value = Create.class)中的value值 为 Create或者 Update 时，才会进行验证
     */
    @NotBlank(message = "名字不能为空", groups = {Create.class, Update.class})
    private String name;

    /**
     * 年龄
     */
    @Max(message = "年龄不能超过120岁", value = 120)
    @Min(message = "年龄不能小于0岁", value = 0)
    private Integer age;

    private Date createTime;

    /**
     *
     *
     * JSR303/JSR-349: JSR303是一项标准,只提供规范不提供实现，规定一些校验规范即校验注解，如@Null，@NotNull，@Pattern，位于javax.validation.constraints包下。JSR-349是其的升级版本，添加了一些新特性。
     *
     *     @Null 被注释的元素必须为null
     *     @NotNull 被注释的元素必须不为null
     *     @AssertTrue 被注释的元素必须为true
     *     @AssertFalse 被注释的元素必须为false
     *     @Min(value) 被注释的元素必须是一个数字，其值必须大于等于指定的最小值
     *     @Max(value) 被注释的元素必须是一个数字，其值必须小于等于指定的最大值
     *     @DecimalMin(value) 被注释的元素必须是一个数字，其值必须大于等于指定的最小值
     *     @DecimalMax(value) 被注释的元素必须是一个数字，其值必须小于等于指定的最大值
     *     @Size(max, min) 被注释的元素的大小必须在指定的范围内
     *     @Digits (integer, fraction) 被注释的元素必须是一个数字，其值必须在可接受的范围内
     *     @Past 被注释的元素必须是一个过去的日期
     *     @Future 被注释的元素必须是一个将来的日期
     *     @Pattern(value) 被注释的元素必须符合指定的正则表达式
     *
     * hibernate validation：hibernate validation是对这个规范的实现，并增加了一些其他校验注解，如@Email，@Length，@Range等等
     *
     *     @Email 被注释的元素必须是电子邮箱地址
     *     @Length 被注释的字符串的大小必须在指定的范围内
     *     @NotEmpty 被注释的字符串的必须非空
     *     @Range 被注释的元素必须在合适的范围内
     *
     * spring validation：spring validation对hibernate validation进行了二次封装，在springmvc模块中添加了自动校验，并将校验信息封装进了特定的类中
     *
     *
     *
     * todo @NotEmpty根据JDK源码注释说明，该注解只能应用于char可读序列(可简单理解为String对象),colleaction,map,array上，因为该注解要求的是对象不为null且size>0，所以只有上述对象是拥有size属性的，而Integer,Long等基础对象包装类没有该属性
     *
     * todo @NotNull,表示不能为null，但可以为empty,与@NotEmpty注解相比是少了size属性，所以"Accepts any type"可以接受任何类型对象
     *
     * todo @NotBlank，"Accepts {@code CharSequence}"表明只应用于char值可读序列，则可以简单理解为只用于String，且不能为null，"non-whitespace"表示不能是空白字符，所以校验字符串是调用trim()方法之后的字符串长度大于0
     *
     */
}

